// 用户路由表

// 加载模块
const express = require('express');
const jwt = require('jsonwebtoken');
const usersModel = require('../db/models/usersModel.js');
const fs = require('fs');
const sendmail = require('../utils/email.js');

// 创建路由表
let router = express.Router();

// 向路由表添加内容：

// 验证是否已登录接口
router.get('/islogin',(req,res)=>{
    let token = req.headers.authorization;
    // console.log( token );

    // 验证token
    jwt.verify(token,'abc123',(err,payload)=>{
        if (err) {
            // 响应请求
            res.send({"code":0,"msg":err});
        } else {
            // 响应请求
            res.send({"code":1,"msg":"token验证成功","info":payload});
        }
    })
})

// 登录接口
router.get('/login',(req,res)=>{// f1
    // 接收参数
    let {username,password} = req.query;

    // 查询数据库
    // usersModel.find({$and:[{'username':username},{'password':password}]})
    usersModel.find({$and:[{username},{password}]})
    .then((result)=>{
        // result = [{}]
        // 判断是否登录成功
        if (result.length > 0) {
            // 创建一个token并返回给前端
            let token = jwt.sign({// 存储当前登录用户的信息
                username: result[0].username,
                nickname: result[0].nickname
            },'abc123',{expiresIn:60*30});

            // 响应请求
            res.send({"code":1,"msg":"登录成功！","token":token});
        } else {
            // 响应请求
            res.send({"code":0,"msg":"账号或密码错误！"});
        }
    })
    .catch((err)=>{
        // 响应请求
        res.send({"code":-1,"msg":err});
    });
});

// 缓存用户验证码
let cacheCode = {
    // '123456789@qq.com': '45346',
    // '123454321@qq.com': '7436',
}

// 注册接口
router.post('/register',(req,res)=>{// f2
    // 接收参数
    let {username,password,nickname,email,sex,age,code} = req.body;

    // 查询数据库
    usersModel.find({username}) // p1
    .then((result)=>{
        // 判断是否已被注册
        if (result.length > 0) {// 已注册
            // 响应请求
            res.send({"code":-1,"msg":"该账号已被注册！"});
            return new Promise(()=>{});// 终止链式调用
        } else {// 未注册
            let regUser = /^\w{6,18}$/;
            if (!regUser.test(username)) {
                res.send({"code":-2,"msg":"账号格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            let regPass = /^\w{6,14}$/;
            if (!regPass.test(password)) {
                res.send({"code":-3,"msg":"密码格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            let regNick = /^.{2,20}$/;
            if (!regNick.test(nickname)) {
                res.send({"code":-4,"msg":"昵称格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            // '99835885@qq.com'
            let regMail = /^\w{6,22}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/;
            if (!regMail.test(email)) {
                res.send({"code":-5,"msg":"邮箱格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            let regSex = /^[男|女|妖]$/;
            if (!regSex.test(sex)) {
                res.send({"code":-6,"msg":"性别格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            let regAge = /^\d{1,3}$/;
            if (!regAge.test(age)) {
                res.send({"code":-7,"msg":"年龄格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }

            // 校验验证码
            if (cacheCode[email] !== code) {
                res.send({"code":-8,"msg":"验证码错误！"});
                return new Promise(()=>{});// 终止链式调用
            }

            // 向数据库添加一条数据
            return usersModel.insertMany({username,password,nickname,email,sex,age});
        }
    })// p2
    .then((result)=>{
        if (result.length > 0) {
            // 响应前端
            res.send({"code":1,"msg":"注册成功！"});
        } else {
            // 响应前端
            res.send({"code":0,"msg":"注册失败！"});
        }
    })
    .catch((err)=>{
        // 响应前端
        res.send({"code":-8,"msg":err});
    })
});

// 发送验证码接口
router.get('/sendmail',(req,res)=>{
    // 获取请求参数
    let {email} = req.query;

    // 验证邮箱格式
    let reg = /^\w{6,18}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/;
    if (!reg.test(email)) {
        return res.send({"code":-1,"msg":"邮箱格式错误！"});
    }

    // 随机生成一个验证码
    let code = parseInt(Math.random()*1000000);

    // 发送邮件
    sendmail(email,'注册验证码','您的注册验证码为:'+code)
    .then(()=>{
        // 缓存用户验证码
        cacheCode[email] = code+'';

        // 响应请求
        res.send({"code":1,"msg":"验证码发送成功！"});
    })
    .catch(err=>{
        // 响应请求
        res.send({"code":0,"msg":"验证码发送失败！"});
    })
})

// 对外暴露接口
module.exports = router;
